<?php
namespace app\index\controller;

use think\Controller;
use think\Db;
// 移除了 use think\captcha\Captcha; 因为不再需要验证码
use app\index\model\User;
use app\index\model\Product;
use app\index\model\Cart;
use app\index\model\Order;
use app\index\model\OrderItem;

class Index extends Controller
{
    public function index()
    {
        // 获取所有产品信息
        $products = Product::select();
        $this->assign('products', $products);
        return $this->fetch();
    }

    public function login()
    {
        if (request()->isPost()) {
            $username = input('post.username');
            $password = input('post.password');
            // 移除了 $captcha 相关的代码，不再需要验证码验证

            // 查询用户
            $user = User::where('username', $username)->find();

            if ($user && password_verify($password, $user->password)) {
                // 登录成功，设置会话
                \think\Session::set('user_id', $user->id);
                \think\Session::set('username', $user->username);
                \think\Session::set('role', $user->role); 

                $this->success('登录成功！', 'index');
            } else {
                $this->error('用户名或密码错误！');
            }
        }
        return $this->fetch();
    }

    public function register()
    {
        if (request()->isPost()) {
            $username = input('post.username');
            $password = input('post.password');
            $password_confirm = input('post.password_confirm');
            // 移除了 $captcha 相关的代码，不再需要验证码验证

            // 检查密码是否一致
            if ($password !== $password_confirm) {
                $this->error('两次密码输入不一致！');
            }

            // 检查用户名是否已存在
            if (User::where('username', $username)->find()) {
                $this->error('用户名已存在！');
            }

            // 创建新用户
            $user = new User();
            $user->username = $username;
            $user->password = password_hash($password, PASSWORD_DEFAULT); // 密码加密存储
            $user->role = 'member'; // 默认注册为会员
            $user->save();

            $this->success('注册成功，请登录！', 'login');
        }
        return $this->fetch();
    }

    public function logout()
    {
        \think\Session::clear(); // 清除所有会话数据
        $this->success('已退出登录', 'index');
    }

    // 移除了 public function captcha() 方法，因为不再需要验证码
    // public function captcha()
    // {
    //     $captcha = new Captcha();
    //     return $captcha->entry();
    // }

    public function productDetail()
    {
        $product_id = input('param.id/d');
        $product = Product::get($product_id);

        if (!$product) {
            $this->error('商品不存在！');
        }
        $this->assign('product', $product);
        return $this->fetch();
    }

    public function addToCart()
    {
        // 尝试从POST获取product_id（来自productdetail.html的form提交）
        $pId = input('post.product_id/d'); 
        $quantity = input('post.quantity/d', 1);

        // 如果POST没有获取到product_id，则尝试从GET获取（来自index.html的链接）
        // 确保使用 param.id 来获取商品ID，与URL规则一致
        if (empty($pId)) {
            $pId = input('param.id/d'); 
        }
        if (empty($quantity)) {
            $quantity = input('param.quantity/d', 1);
        }

        $user_id = \think\Session::get('user_id');
        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        if ($quantity <= 0) {
            $this->error('购买数量不能小于等于0！');
        }

        // 检查商品是否存在，使用 $pId
        $product = Product::get($pId);
        if (!$product) {
            $this->error('商品不存在！');
        }

        // 检查库存
        if ($quantity > $product->stock) {
            $this->error('库存不足！当前库存：' . $product->stock);
        }

        // 查找购物车中是否已有该商品
        $cartItem = Cart::where('user_id', $user_id)
                        ->where('product_id', $pId) 
                        ->find();

        if ($cartItem) {
            // 如果存在，更新数量
            $newQuantity = $cartItem->quantity + $quantity;
            if ($newQuantity > $product->stock) {
                $this->error('加入购物车后将超过库存！当前库存：' . $product->stock . '，购物车中已有：' . $cartItem->quantity);
            }
            $cartItem->quantity = $newQuantity;
            $cartItem->save();
        } else {
            // 如果不存在，新增购物车项
            $cartItem = new Cart();
            $cartItem->user_id = $user_id;
            $cartItem->product_id = $pId; 
            $cartItem->quantity = $quantity;
            $cartItem->save();
        }

        $this->success('已成功加入购物车！', 'cart');
    }

    public function cart()
    {
        $user_id = \think\Session::get('user_id');
        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        $cartItems = Cart::with('product')->where('user_id', $user_id)->select();
        $totalPrice = 0;
        foreach ($cartItems as $item) {
            if ($item->product) { // 确保商品存在
                $totalPrice += $item->quantity * $item->product->pPrice; 
            } else {
                // 如果商品不存在，可以考虑移除购物车项或给出提示
                // $item->delete();
            }
        }

        $this->assign('cartItems', $cartItems);
        $this->assign('totalPrice', $totalPrice);
        return $this->fetch();
    }

    public function updateCart()
    {
        $cart_id = input('post.cart_id/d');
        $quantity = input('post.quantity/d');

        $user_id = \think\Session::get('user_id');
        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        $cartItem = Cart::where('id', $cart_id)->where('user_id', $user_id)->find();
        if (!$cartItem) {
            $this->error('购物车商品不存在！');
        }

        if ($quantity <= 0) {
            $cartItem->delete(); // 数量为0则从购物车移除
            $this->success('商品已从购物车移除！', 'cart');
        }

        // 检查库存
        $product = Product::get($cartItem->product_id); 
        if (!$product) {
            $cartItem->delete(); // 如果商品不存在，也移除购物车项
            $this->error('商品不存在，已从购物车移除！', 'cart');
        }

        if ($quantity > $product->stock) {
            $this->error('库存不足！当前库存：' . $product->stock);
        }

        $cartItem->quantity = $quantity;
        $cartItem->save();
        $this->success('购物车更新成功！', 'cart');
    }

    public function removeCartItem()
    {
        $cart_id = input('post.cart_id/d');

        $user_id = \think\Session::get('user_id');
        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        $cartItem = Cart::where('id', $cart_id)->where('user_id', $user_id)->find();
        if ($cartItem) {
            $cartItem->delete();
            $this->success('商品已从购物车移除！', 'cart');
        } else {
            $this->error('购物车商品不存在或无权操作！');
        }
    }

    public function checkout()
    {
        $user_id = \think\Session::get('user_id');
        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        // 获取购物车商品
        $cartItems = Cart::with('product')->where('user_id', $user_id)->select();
        
        if (empty($cartItems)) { 
            $this->error('购物车为空，无法结算！', 'cart'); 
        }

        Db::startTrans(); // 开启事务
        try {
            // 1. 创建订单
            $order = new Order();
            $order->user_id = $user_id;
            $order->order_sn = date('YmdHis') . uniqid(); // 生成唯一订单号
            $total_price = 0;

            foreach ($cartItems as $item) {
                $product = $item->product;
                // 确保商品存在，数量有效，且不超出库存
                if (!$product) { 
                    throw new \Exception('购物车中存在已下架或不存在的商品，请检查！'); 
                }
                if ($item->quantity <= 0) { 
                    throw new \Exception('购物车中商品数量异常，请检查！');
                }
                if ($item->quantity > $product->stock) { 
                    throw new \Exception('商品 "' . $product->pName . '" 库存不足！当前库存：' . $product->stock); 
                }
                $total_price += $item->quantity * $product->pPrice;
            }
            $order->total_price = $total_price;
            $order->order_status = 0; // 订单创建时，设置为待支付
            $order->save(); // 保存订单

            // 2. 创建订单项并更新商品库存
            foreach ($cartItems as $item) {
                $orderItem = new OrderItem();
                $orderItem->order_id = $order->id;
                $orderItem->product_id = $item->product_id;
                $orderItem->product_name = $item->product->pName;
                $orderItem->product_price = $item->product->pPrice;
                $orderItem->quantity = $item->quantity;
                $orderItem->save();

                $product = Product::get($item->product_id); // 重新获取商品确保数据最新
                $product->stock -= $item->quantity;
                $product->save();
            }

            // 3. 清空购物车
            Cart::where('user_id', $user_id)->delete();

            Db::commit(); // 提交事务
            
            // 订单创建成功，正常跳转
            $this->success('订单创建成功，请尽快支付！', 'myOrders'); 
        } catch (\Throwable $e) { // 捕获 Throwable，包括 Exception 和 Error
            Db::rollback(); // 捕获到任何异常都回滚事务

            // 如果捕获到的是 ThinkPHP 内部的 HttpResponseException (例如来自 $this->error() 或 $this->success())
            // 则将它重新抛出，让框架的 Dispatcher 正常处理页面跳转
            if ($e instanceof \think\exception\HttpResponseException) {
                throw $e; 
            }

            // 否则，它是一个真正的业务逻辑错误，显示订单创建失败及具体消息
            $this->error('订单创建失败：' . $e->getMessage()); 
        }
    }

    public function myOrders()
    {
        // 检查是否登录以及是否为会员或管理员
        $role = \think\Session::get('role');
        if (!in_array($role, ['member', 'admin'])) {
            $this->error('请先登录会员账户！', 'login');
        }
        $user_id = \think\Session::get('user_id');
        // 关联 orderItems 获取订单项，但这里只用于展示订单本身信息，实际订单项在orderDetail
        $orders = Order::where('user_id', $user_id)->order('create_time desc')->select();

        $this->assign('orders', $orders);
        return $this->fetch();
    }

    public function orderDetail()
    {
        $order_id = input('param.orderId/d');
        $user_id = \think\Session::get('user_id');

        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        // 关联 orderItems 和 product，以便在详情页显示商品信息
        $order = Order::with('orderItems.product')->where('id', $order_id)->where('user_id', $user_id)->find();

        if (!$order) {
            $this->error('订单不存在或无权查看！');
        }

        $this->assign('order', $order);
        return $this->fetch();
    }

    /**
     * 模拟支付订单
     */
    public function payOrder()
    {
        $order_id = input('param.orderId/d');
        $user_id = \think\Session::get('user_id');

        if (!$user_id) {
            $this->error('请先登录！', 'login');
        }

        $order = Order::where('id', $order_id)->where('user_id', $user_id)->find();

        if (!$order) {
            $this->error('订单不存在或无权操作！');
        }

        if ($order->order_status == 1) { // 订单状态 1 代表已支付
            $this->success('订单已支付，无需重复操作！', 'myOrders');
        }

        Db::startTrans();
        try {
            // 模拟支付成功，更新订单状态和支付时间
            $order->order_status = 1; // 设置为已支付
            $order->pay_time = date('Y-m-d H:i:s'); // 记录支付时间
            $order->save();

            // 这里可以添加其他支付成功后的逻辑，例如发送通知、更新用户积分等

            Db::commit();
            // *** 关键修复点：使用 url() 助手函数来正确生成带参数的跳转URL ***
            $this->success('支付成功！', url('index/orderDetail', ['orderId' => $order_id]));
        } catch (\Throwable $e) {
            Db::rollback();
            // 如果是HttpResponseException，重新抛出，让框架处理页面跳转
            if ($e instanceof \think\exception\HttpResponseException) {
                throw $e;
            }
            $this->error('支付失败：' . $e->getMessage());
        }
    }
}